home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 010 / blit.arc / ADDOBS.C next >
Text File  |  1985-05-23  |  4KB  |  135 lines

  1. /*
  2.  * name:         addobs
  3.  *
  4.  * description: add obscured rectangle argr to obscured list op
  5.  *              of layer lp, subdividing obscured portions
  6.  *              of layers as necessary.
  7.  *
  8.  * synopsis:     boolean addobs (op, argr, newr, lp)
  9.  *              struct obscured *op;
  10.  *              struct rectangle     argr;
  11.  *              struct rectangle     newr;
  12.  *              struct layer    *lp;
  13.  *
  14.  * globals:      none.
  15.  *
  16.  * calls:        rectxrect  (rectxrect.c)
  17.  *              addobs      (addobs.c)
  18.  *              addrect     (addrect.c)
  19.  *              balloc      (balloc.c)
  20.  *              malloc      (libc)
  21.  *              bitblt      (bitblt.c)
  22.  *
  23.  * called by:    newlayer  (newlayer.c)
  24.  *              addobs     (addobs.c)
  25.  */
  26. #include "layers.h"
  27.  
  28. boolean addobs (op, argr, newr, lp)
  29. struct obscured *op;
  30. struct rectangle  *argr;               /* struct obscured rectangle */
  31. struct rectangle  *newr;               /* complete rectangle of new layer */
  32. struct layer  *lp;                     /* layer op belongs to */
  33. {
  34.    struct obscured *newop;
  35.    struct rectangle     r;
  36.    struct bitmap   *bp;
  37.    struct rectangle     temp;
  38.  
  39.    struct bitmap   *balloc ();
  40.    char    *malloc ();
  41.  
  42.    /* r = *argr;   */                   /* argr will be unchanged through
  43.                                          addobs() */
  44.      r.origin.x = argr -> origin.x;
  45.      r.origin.y = argr -> origin.y;
  46.      r.corner.x = argr -> corner.x;
  47.      r.corner.y = argr -> corner.y;
  48.     if (rectxrect (&r, newr)) {
  49.    /*
  50.     * this is much like layerop()
  51.     */
  52.        if (r.origin.y < newr -> origin.y) {
  53.        /*
  54.         * temp = piece of r below newr;
  55.         */
  56.            temp.origin.x = r.origin.x;
  57.            temp.origin.y = r.origin.y;
  58.            temp.corner.x = r.corner.x;
  59.            temp.corner.y = newr -> origin.y;
  60.             (void) addobs (op, &temp, newr, lp);
  61.            r.origin.y = newr -> origin.y;
  62.        }
  63.        if (r.corner.y > newr -> corner.y) {
  64.        /*
  65.         * temp = piece of r above newr;
  66.         */
  67.            temp.origin.x = r.origin.x;
  68.            temp.corner.x = r.corner.x;
  69.            temp.corner.y = r.corner.y;
  70.            temp.origin.y = newr -> corner.y;
  71.             (void) addobs (op, &temp, newr, lp);
  72.            r.corner.y = newr -> corner.y;
  73.        }
  74.        if (r.origin.x < newr -> origin.x) {
  75.        /*
  76.         * temp = piece of r to the left of newr;
  77.         */
  78.            temp.origin.x = r.origin.x;
  79.            temp.origin.y = r.origin.y;
  80.            temp.corner.y = r.corner.y;
  81.            temp.corner.x = newr -> origin.x;
  82.             (void) addobs (op, &temp, newr, lp);
  83.            r.origin.x = newr -> origin.x;
  84.        }
  85.        if (r.corner.x > newr -> corner.x) {
  86.        /*
  87.         * temp = piece of r to the right of newr;
  88.         */
  89.            temp.origin.y = r.origin.y;
  90.            temp.corner.x = r.corner.x;
  91.            temp.corner.y = r.corner.y;
  92.            temp.origin.x = newr -> corner.x;
  93.             (void) addobs (op, &temp, newr, lp);
  94.            r.corner.x = newr -> corner.x;
  95.        }
  96.    /*
  97.     * r is now contained in rectangle of new layer
  98.     */
  99.       if ((r.origin.x == argr -> origin.x) &&
  100.                (r.origin.y == argr -> origin.y) &&
  101.                (r.corner.x == argr -> corner.x) &&
  102.                (r.corner.y == argr -> corner.y)) {
  103.            (void) addrect (&r, op -> ob_obs);
  104.            return (false);             /* no subdivision */
  105.        }
  106.        (void) addrect (&r, op -> ob_obs);
  107.    }
  108.    bp = balloc (&r);
  109.  /*
  110.   * newop = new struct obscured
  111.  */
  112.    newop = (struct obscured    *) malloc ((unsigned) sizeof (struct obscured));
  113.  /*
  114.  * copy the subdivided portion of the image
  115.  */
  116.    (void) bitblt (op -> ob_bmap, &r, bp, &(bp -> bm_rect.origin), null, s);
  117.    newop -> ob_bmap = bp;
  118.    newop -> ob_rect.origin.x = r.origin.x;
  119.    newop -> ob_rect.origin.y = r.origin.y;
  120.    newop -> ob_rect.corner.x = r.corner.x;
  121.    newop -> ob_rect.corner.y = r.corner.y;
  122.     newop -> ob_obs = op -> ob_obs;
  123.  /*
  124.  * link newop into end of lp -> obs
  125.  */
  126.    if (lp -> ly_endobs != null)
  127.        lp -> ly_endobs -> ob_next = newop;
  128.    else
  129.        lp -> ly_obs = newop;
  130.    newop -> ob_prev = lp -> ly_endobs;
  131.    newop -> ob_next = null;
  132.    lp -> ly_endobs = newop;
  133.    return (true);                      /* subdivision */
  134. }
  135.